home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / dcview / src / dcmain.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-23  |  38.0 KB  |  1,211 lines

  1. /******************************************************************************
  2.  *  DCmain.c:  DC_View for SX-Window Ver 1.66    1997.05.23  f.ogasawara
  3.  ******************************************************************************
  4.  *
  5.  *
  6.  */
  7. #include <zmusic.h>
  8. #include <sxdef2.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <io.h>
  13. #include <jfctype.h>
  14. #include <doslib.h>
  15. #include <event.h>        /* イベントマンを利用するときに必要    */
  16. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  17. #include <window.h>        /* ウィンドウマンを利用するときに必要    */
  18. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  19. #include <control.h>        /* コントロールマンを利用するときに必要    */
  20. #include <task.h>        /* タスクマンを利用するときに必要    */
  21. #include "DC.h"            /* このプログラム固有のヘッダファイル    */
  22.  
  23. char _sxkernelcomm[] = SXKERNEL;    /* カーネル起動コマンド        */
  24.  
  25. /******************************************************************************
  26.  *    main():        メイン関数
  27.  ******************************************************************************
  28.  */
  29. int main(void)
  30. {
  31.     ComVal cv;            /* 共通変数            */
  32.  
  33.     if (!init(&cv)) {        /* 初期化処理を行う        */
  34.         showErrDialog(&cv);    /* エラーダイアログを表示する    */
  35.         cv.endFlag = TRUE;    /* 終了フラグをセットする    */
  36.     }
  37.     /* 終了フラグがセットされるまでループする */
  38.     while (!cv.endFlag) {
  39.         cv.errorCode = 0;    /* エラーコードをクリアする    */
  40.         /* タスクマンからイベントを取得する */
  41.         TSEventAvail(cv.eventMask, &cv.event);
  42.         /* 各イベントに対応した処理を行う */
  43.         switch (cv.event.ts.what) {
  44.         case E_MSLDOWN:        /* マウスレフトダウンイベント    */
  45.             msLDownEvent(&cv);
  46.             break;
  47.         case E_MSRDOWN:        /* マウスライトダウンイベント    */
  48.             msRDownEvent(&cv);
  49.             break;
  50.         case E_IDLE:        /* アイドルイベント        */
  51.             IdleEvent(&cv);
  52.             break;
  53.         case E_KEYDOWN:        /* キーダウンイベント        */
  54.             keyDownEvent(&cv);
  55.             break;
  56.         case E_UPDATE:        /* アップデートイベント        */
  57.             updateEvent(&cv);
  58.             break;
  59.         case E_ACTIVATE:    /* アクティベートイベント    */
  60.             activateEvent(&cv);
  61.             break;
  62.         case E_SYSTEM1:        /* システムイベント        */
  63.         case E_SYSTEM2:
  64.             systemEvent(&cv);
  65.             break;
  66.         }
  67.         if (cv.errorCode != 0) { /* エラーが発生したか?    */
  68.             showErrDialog(&cv); /* エラーダイアログを表示する */
  69.             break;
  70.         }
  71.     }
  72.     /* 終了手続きを行う */
  73.     endProc(((cv.errorCode == 0) ? EXIT_SUCCESS : EXIT_FAILURE), &cv);
  74.  
  75.     return 0;
  76. }
  77.  
  78. /******************************************************************************
  79.  *    init():        初期化処理
  80.  ******************************************************************************
  81.  *    引数:    ComVal *pcv    共通変数へのポインタ
  82.  *    戻り値:    BOOLEAN        = TRUE:  初期化成功
  83.  *                = FALSE: 初期化失敗(終了)
  84.  *    注釈:    共通変数の初期化、アボート処理関数の登録、ウィンドウの作成と
  85.  *        表示などを行う。
  86.  */
  87. BOOLEAN init(ComVal *pcv)
  88. {
  89.     int i,j,ret,ofsetc;
  90.     char name[90];
  91.  
  92.     pcv->windowPtr = NULL;        /* ウィンドウポインタ        */
  93.     pcv->activeFlag = FALSE;    /* アクティブフラグ        */
  94.     pcv->eventMask = EVENTMASK;    /* イベントマスク        */
  95.     pcv->errorCode = 0;        /* エラーコード            */
  96.     pcv->endFlag = FALSE;        /* 終了フラグ            */
  97.     pcv->hResMap = NULL;        /* リソースマップのハンドル    */
  98.     pcv->resOk = 0;
  99.     pcv->menuHdl  = NULL;        /* メニューハンドル        */
  100.     pcv->menuHdl2 = NULL;        /* メニューハンドル        */
  101.  
  102.     pcv->updateRgnHdl = NULL;    /* テキスト表示        */
  103.     pcv->txtRgnHdl = NULL;
  104.     pcv->winRgnHdl = NULL;
  105.     pcv->txt = NULL;
  106.     pcv->txtNo = NULL;
  107.     pcv->ofset = 0;
  108.     pcv->scrollFlag = 0;
  109.     pcv->scrollDir = 0;
  110.  
  111.     pcv->pastFno = 0;
  112.  
  113.     pcv->pre_esc = 0;        /* テキスト処理        */
  114.     pcv->loadFlag = 0;
  115.     pcv->mloadFlag = 0;
  116.     pcv->currentPath[0] = 0;
  117.     pcv->currentFname[0] = 0;
  118.     strcpy(pcv->a_drv, "A:");
  119.     strcpy(pcv->b_drv, "B:");
  120.     strcpy(pcv->c_drv, "C:");
  121.     pcv->fontK[0] = G_ROM12;
  122.     pcv->fontK[1] = G_ROM16;
  123.     pcv->fontS[0] = 12;
  124.     pcv->fontS[1] = 16;
  125.     pcv->fontL[0] = 16;
  126.     pcv->fontL[1] = 24;
  127.  
  128.     /* cutfile load        */
  129.     for(i=0;i<MAX_DEPTH;i++)
  130.         pcv->cutNo[i] = 1;
  131.  
  132.     pcv->txtRgnHdl = GMNewRgn();
  133.     pcv->winRgnHdl = GMNewRgn();
  134.  
  135.     for(i=0;i<MAX_CUTS;i++) {
  136.         for(j=0;j<MAX_DEPTH;j++) {
  137.             pcv->bitsH[i][j] = NULL;
  138.             pcv->offgraphOK[i][j] = 0;
  139.         }
  140.     }
  141.  
  142.     pcv->mojiFlag = 0;        /* 文字列検索        */
  143.     pcv->status = 0;
  144.  
  145.     strcpy(pcv->title, "DC_VIEW");    /* タイトル        */
  146.  
  147.     pcv->set_as_a = 0;
  148.     pcv->fore_color = 8;
  149.     pcv->back_color = 11;
  150.  
  151.     TSSetAbort(endProc, (long) pcv); /* アボート処理関数を登録する    */
  152.  
  153.     if (LOWWORD(SXVer()) < SXVER2) { /* SXシステムのバージョンを調べる */
  154.         pcv->errorCode = 1;    /* バージョン2より古い        */
  155.         return FALSE;        /* 失敗したのでFALSEを返す    */
  156.     }
  157.  
  158.     if (!openResource(pcv))     {    /* リソースファイルを読み込む    */
  159.         /* オープンできなかった    */
  160.         pcv->errorCode = 2;    /* 作成できなかった        */
  161.         return FALSE;        /* 失敗したのでFALSEを返す    */
  162.     }
  163.     pcv->resOk = 1;            /* 作成できた            */
  164.  
  165.     pcv->menuHdl  = TSReferMN(128);    /* メニューハンドルの取得       */
  166.     pcv->menuHdl2 = TSReferMN(129);    /* メニューハンドルの取得       */
  167.     (_Handle *) pcv->pcmHdl = TSRscGet('pram', 128); /* 環境読み込み*/
  168.     (_Handle *) pcv->mzHdl  = TSRscGet('pram', 129);
  169.     (_Handle *) pcv->picHdl = TSRscGet('pram', 130);
  170.     (_Handle *) pcv->envHdl = TSRscGet('pram', 131);
  171.     (_Handle *) pcv->stsHdl = TSRscGet('pram', 132);
  172.     (_Handle *) pcv->cpthHdl= TSRscGet('pram', 133);
  173.     (_Handle *) pcv->dpthHdl= TSRscGet('pram', 134);
  174.     (_Handle *) pcv->env2Hdl= TSRscGet('pram', 135);
  175.  
  176.     if (pcv->pcmHdl == NULL || pcv->mzHdl == NULL
  177.         || pcv->picHdl == NULL || pcv->envHdl == NULL) {
  178.         pcv->errorCode = 2;    /* 作成できなかった        */
  179.         return FALSE;        /* 失敗したのでFALSEを返す    */
  180.     }
  181.  
  182.     pcv->mzTask  = **pcv->mzHdl;    /* 起動プログラム    */
  183.     pcv->pcmTask = **pcv->pcmHdl;
  184.     pcv->picTask = **pcv->picHdl;
  185.  
  186.     pcv->scrollstep = **pcv->envHdl;
  187.     pcv->cutDisp    = *((*pcv->envHdl) + 1);
  188.     pcv->lineDisp    = *((*pcv->envHdl) + 2);
  189.     pcv->picOff    = *((*pcv->envHdl) + 3);
  190.     pcv->font    = *((*pcv->envHdl) + 4);
  191.     pcv->saveFlag    = *((*pcv->envHdl) + 5);
  192.  
  193.     pcv->win_h = pcv->fontS[pcv->font] * 48; /*ウィンドウサイズ */
  194.     pcv->win_v = 20 + pcv->fontS[pcv->font] * 30;
  195.  
  196.  
  197.     pcv->fcache    = *((*pcv->env2Hdl) + 3);
  198.     pcv->fcache_c = pcv->fcache;
  199.  
  200.     for(i=0;i<MAX_DEPTH;i++) {        /* ファイルキャッシュフラグ    */
  201.         pcv->fcache_d[i] = -1;
  202.         pcv->txt_cache[i] = NULL;
  203.         pcv->txtNo_cache[i] = NULL;
  204.     }
  205.     pcv->depth = 0;
  206.  
  207.     if (pcv->saveFlag) {
  208.         pcv->ofset = *((*pcv->envHdl) + 18);
  209.         ofsetc = pcv->ofset;
  210.         pcv->pastFno = *((*pcv->envHdl) + 6);
  211.         strcpy(pcv->a_drv, *pcv->dpthHdl);
  212.         strcpy(pcv->b_drv, *pcv->dpthHdl + 90);
  213.         strcpy(pcv->c_drv, *pcv->dpthHdl + 180);
  214.         strcpy(pcv->title, *pcv->dpthHdl + 270);
  215.         if (pcv->pastFno > 0) {
  216.             strcpy(pcv->currentFname, *pcv->stsHdl);
  217.             strcpy(name, pcv->currentFname);
  218.             strcpy(pcv->currentPath, *pcv->cpthHdl);
  219.             for(i=0;i<pcv->pastFno;i++) {
  220.                 pcv->pastofset[i] = *((*pcv->envHdl) + 7 + i);
  221.                 strcpy(&pcv->pastFname[i][0], (*pcv->stsHdl) + (i + 1) * 90);
  222.                 strcpy(&pcv->pastPath[i][0], (*pcv->cpthHdl) + (i + 1) * 90);
  223.             }
  224.         }
  225.         pcv->normal = 0;
  226.  
  227.         *((*pcv->envHdl) + 5)    =  !pcv->saveFlag;
  228.         TSResSave(pcv->lbFname);
  229.     } else {
  230.         pcv->normal = 1;
  231.     }
  232.  
  233.     strcpy(pcv->mzFname,     (*pcv->mzHdl)  +  1);
  234.     strcpy(pcv->mzOpt,     (*pcv->mzHdl)  + 91);
  235.     strcpy(pcv->pcmFname,     (*pcv->pcmHdl) +  1);
  236.     strcpy(pcv->pcmOpt,     (*pcv->pcmHdl) + 91);
  237.     strcpy(pcv->picFname,     (*pcv->picHdl) +  1);
  238.     strcpy(pcv->picOpt,     (*pcv->picHdl) + 91);
  239.  
  240.     if (!createWindow(pcv)) {    /* ウィンドウを作成する        */
  241.         pcv->errorCode = 2;    /* 作成できなかった        */
  242.         return FALSE;        /* 失敗したのでFALSEを返す    */
  243.     }
  244.  
  245.     pcv->set_as_a    = *((*pcv->env2Hdl)    );
  246.     pcv->fore_color    = *((*pcv->env2Hdl) + 1);
  247.     pcv->back_color    = *((*pcv->env2Hdl) + 2);
  248.  
  249.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  250.     GMAPage(G_PAGE0 | G_PAGE1 | G_PAGE2);
  251.     GMBackColor(pcv->back_color);
  252.     GMForeColor(pcv->fore_color);
  253.     GMFontKind(G_ROM12);
  254.     GMFontMode(G_PSET);
  255.     GMPenMode(LONGWORD(G_BACK,G_PSET));
  256.     GMFontFace(G_PLANE);
  257.  
  258.     if (!pcv->normal && pcv->fcache) {
  259.         ret = 1;
  260.         if (pcv->pastFno > 0) {
  261.             for(i=0;i<pcv->pastFno;i++) {
  262.                 ret = GetData(pcv,pcv->pastFname[i]);
  263.                 if (!ret) break;
  264.             }
  265.             if (ret) {
  266.                 ret = GetData(pcv,name);
  267.                 pcv->ofset = ofsetc;
  268.             }
  269.             if (!ret) {
  270.                 pcv->normal = 1;
  271.                 for(i=0;i<MAX_DEPTH;i++) {        /* ファイルキャッシュフラグ    */
  272.                     pcv->fcache_d[i] = -1;
  273.                     pcv->txt_cache[i] = NULL;
  274.                     pcv->txtNo_cache[i] = NULL;
  275.                 }
  276.                 pcv->depth = 0;
  277.                 pcv->pastFno = 0;
  278.             } else
  279.                 if (i>0) CMShine(pcv->btn12Hdl,C_ACTIVE);
  280.         }
  281.     }
  282.  
  283.     return TRUE;            /* 成功したのでTRUEを返す    */
  284. }
  285.  
  286. /******************************************************************************
  287.  *    openResource():    リソースファイルのオープン
  288.  ******************************************************************************
  289.  *    引数:    ComVal *pcv    共通変数へのポインタ
  290.  *    戻り値:    BOOLEAN        = TRUE:  読み込み成功
  291.  *                = FALSE: 読み込み失敗(終了)
  292.  */
  293. BOOLEAN openResource(ComVal *pcv)
  294. {
  295.     int errCode;            /* エラーコード            */
  296.     Task tsbuf;            /* タスク管理レコード        */
  297.     char drv[2], path[65], node[19], ext[5];
  298.     char name[23], fileName[TS_NAMEMAX];
  299.     char szFile[TS_NAMEMAX];    /* フルパスでファイル名が戻るバッファ */
  300.     _Handle *versHdl;
  301.  
  302.     /* リソースファイルのオープン&読み込み */
  303.     EMEnCross();
  304.     /* タスク名を取得する */
  305.     TSGetTdb(&tsbuf, TS_OWN);
  306.     /* タスク名を分解 */
  307.     strsfn(tsbuf.name, drv, path, node, ext);
  308.     /* 検索パスを作成 */
  309.     strmfn(szFile, drv, path, "", "");
  310.     strcpy(pcv->myPath, szFile);
  311.     /* リソースファイルを検索 */
  312.     errCode = TSSearchFile("DC_VIEW.LB", szFile, szFile);
  313.     strcpy(pcv->lbFname, szFile);
  314.     if (errCode < 0) {
  315.         EMDeCross();
  316.         /* 待ち状態を示すマウスポインタを元に戻す */
  317.         DMError(D_CONFIRM, "リソースファイル「DC_VIEW.LB」が\r"
  318.                    "見付かりません。");
  319.         return FALSE;
  320.     }
  321.     /* リソースのオープン,リソースマップの獲得 */
  322.     pcv->hResMap = TSResOpen(szFile);
  323.     if (pcv->hResMap == NULL) {
  324.         /* 待ち状態を示すマウスポインタを元に戻す */
  325.         EMDeCross();
  326.         DMError(D_CONFIRM, "リソースファイルが\r"
  327.                    "オープンできません。");
  328.         return FALSE;
  329.     }
  330.     /* すべてのリソースを読み込む(ファイルはクローズされる)*/
  331.     errCode = TSResLoad();
  332.     if (errCode < 0) {
  333.         /* 待ち状態を示すマウスポインタを元に戻す */
  334.         EMDeCross();
  335.         DMError(D_CONFIRM, "リソースファイルの読み込みに\r"
  336.                    "失敗しました。");
  337.         return FALSE;
  338.     }
  339.  
  340.     pcv->versHdl = TSRscGet('vers', 128); /* バージョン読み込み*/
  341.     if ((pcv->versHdl == NULL) || strcmp(*pcv->versHdl, "1.66")) {
  342.         EMDeCross();
  343.         DMError(D_CONFIRM, "リソースファイルの\r"
  344.                    "バージョンが違います。");
  345.         return FALSE;
  346.     }
  347.     EMDeCross();
  348. }
  349.  
  350. /******************************************************************************
  351.  *    createWindow():    ウィンドウの作成
  352.  ******************************************************************************
  353.  *    引数:    ComVal *pcv    共通変数へのポインタ
  354.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  355.  *                = FALSE: 作成失敗(終了)
  356.  */
  357. BOOLEAN createWindow(ComVal *pcv)
  358. {
  359.     int paramFlags;            /* パラメータの有無        */
  360.     Rect rc,rc2;
  361.     Task task;            /* タスク管理レコード        */
  362.     int ret,do_load = 0;
  363.     char name[256];
  364.  
  365.     Rect winSize = { 0, 0, WIN_H, WIN_V }; /* ウィンドウサイズ*/
  366.     Rect disp;
  367.     Point top;
  368.  
  369.     winSize.d.right  = pcv->win_h;
  370.     winSize.d.bottom = pcv->win_v;    /*ウィンドウサイズ */
  371.  
  372.     TSGetTdb(&task, TS_OWN);    /* タスク管理レコードを取得する    */
  373.     paramFlags = TSTakeParam(    /* コマンドラインを解析する    */
  374.         task.command,        /* コマンドライン        */
  375.         &rc,            /* 指定されたウィンドウ位置    */
  376.         name,            /* 最終文字列を格納する    */
  377.         0,            /* アドレステーブルを保存しない    */
  378.         NULL,            /* アドレステーブルを作成しない    */
  379.         NULL);            /* ポインタを確保しない    */
  380.     if (!(paramFlags & 1)) {    /* ウィンドウ位置の指定があるか? */
  381.         /* ない場合、システムからウィンドウの左上座標を取得する */
  382.         rc = winSize;
  383.         SXGetDispRect(&disp);
  384.         top.p.x = (disp.d.right + disp.d.left) / 2 - rc.d.right / 2;
  385.         top.p.y = (disp.d.bottom + disp.d.top) / 2 - rc.d.bottom / 2;
  386.         if ((top.p.x - disp.d.left) < 0)
  387.             top.p.x = 0;
  388.         if ((top.p.y - disp.d.top ) < 11)
  389.             top.p.y = 11 + disp.d.top;
  390.         GMSlideRect(&rc, top.x_y);
  391.     } else {
  392.         rc2 = rc;
  393.         rc = winSize;
  394.         rc.d.top = rc.d.top + rc2.d.top;
  395.         rc.d.right = rc.d.right + rc2.d.left ;
  396.         rc.d.bottom = rc.d.bottom + rc2.d.top;
  397.         rc.d.left = rc.d.left + rc2.d.left ;
  398.     }
  399.     pcv->windowPtr = WMOpen(    /* ウィンドウをオープンする    */
  400.         NULL,            /* ウィンドウポインタを確保する    */
  401.         &rc,            /* ウィンドウの表示位置        */
  402.         WINTITLE,        /* ウィンドウタイトル        */
  403.         FALSE,            /* オープン時に描画しない    */
  404.         WI_STD2 << 4,        /* タイトルの広い標準ウィンドウ    */
  405.         W_FRONT,        /* 一番手前に表示する        */
  406.         TRUE,            /* クローズボタンを使用する    */
  407.         TSGetID());        /* 自分のタスクID        */
  408.     if (pcv->windowPtr == NULL)
  409.         return FALSE;        /* 失敗したのでFALSEを返す    */
  410.  
  411.     structControl(pcv);        /* コントロールの作成        */
  412.  
  413.     setWinSize(pcv);
  414.     WMShow(pcv->windowPtr);        /* ウィンドウを表示する        */
  415.                     /* 文字列の指定があるか?     */
  416.     if ((paramFlags & 2)==2) {
  417.         if (pcv->pastFno == 0)
  418.             GetData(pcv, name);
  419.         else if (pcv->normal || !pcv->fcache)
  420.             GetData(pcv, name);
  421.     }
  422.  
  423.     return TRUE;            /* 成功したのでTRUEを返す    */
  424. }
  425.  
  426. /******************************************************************************
  427.  *    structControl():    コントロールの作成
  428.  ******************************************************************************
  429.  *    引数:    ComVal *pcv    共通変数へのポインタ
  430.  *    注釈:
  431.  */
  432. void structControl(ComVal *pcv)
  433. {
  434.     pcv->btn1Hdl =TSReferCM(128,pcv->windowPtr);
  435.     pcv->btn2Hdl =TSReferCM(129,pcv->windowPtr);
  436.     pcv->btn3Hdl =TSReferCM(130,pcv->windowPtr);
  437.     pcv->btn4Hdl =TSReferCM(131,pcv->windowPtr);
  438.     pcv->btn5Hdl =TSReferCM(132,pcv->windowPtr);
  439.     pcv->btn6Hdl =TSReferCM(133,pcv->windowPtr);
  440.     pcv->btn7Hdl =TSReferCM(134,pcv->windowPtr);
  441.     pcv->btn8Hdl =TSReferCM(135,pcv->windowPtr);
  442.     pcv->btn9Hdl =TSReferCM(136,pcv->windowPtr);
  443.     pcv->btn92Hdl=TSReferCM(142,pcv->windowPtr);
  444.     pcv->btn93Hdl=TSReferCM(143,pcv->windowPtr);
  445.     pcv->btn10Hdl=TSReferCM(137,pcv->windowPtr);
  446.     pcv->btn11Hdl=TSReferCM(138,pcv->windowPtr);
  447.     pcv->btn12Hdl=TSReferCM(139,pcv->windowPtr);
  448.  
  449.     pcv->volHdl=TSReferCM(140,pcv->windowPtr);
  450. }
  451.  
  452. /******************************************************************************
  453.  *    setWinSize():    ウィンドウの大きさを変更
  454.  ******************************************************************************
  455.  *    引数:    ComVal *pcv    共通変数へのポインタ
  456.  *    注釈:
  457.  *    ウィンドウ上でマウスの左ボタンが押された場合の処理を行う。
  458.  *    この処理でクローズボタンによる終了、ウィンドウの移動が可能となります。
  459.  */
  460. void setWinSize(ComVal *pcv)
  461. {
  462.     Rect txtrc =  { 0, 0, WIN_H, WIN_V - 20 };
  463.  
  464.  
  465.     pcv->win_h = pcv->fontS[pcv->font] * 48; /*ウィンドウサイズ */
  466.     pcv->win_v = 20 + pcv->fontS[pcv->font] * 30;
  467.  
  468.     pcv->rcl.d.left   = pcv->win_h - 67 - 2;
  469.     pcv->rcl.d.top    = pcv->win_v - 16 - 2;
  470.     pcv->rcl.d.right  = pcv->win_h - 67 + 5 * 6 + 2;
  471.     pcv->rcl.d.bottom = pcv->win_v - 16 + 12 + 2;
  472.  
  473.     pcv->lxy.p.x = pcv->win_h - 67;
  474.     pcv->lxy.p.y = pcv->win_v - 16;
  475.  
  476.     txtrc.d.right  = pcv->win_h;
  477.     txtrc.d.bottom = pcv->win_v - 20;
  478.  
  479.     pcv->view.d.left   = pcv->fontS[pcv->font];
  480.     pcv->view.d.top    = 0;
  481.     pcv->view.d.right = pcv->win_h;
  482.     pcv->view.d.bottom = pcv->win_v - 19;
  483.  
  484.     pcv->rcl.d.left   = pcv->win_h - 67 - 2;
  485.     pcv->rcl.d.top    = pcv->win_v - 16 - 2;
  486.     pcv->rcl.d.right  = pcv->win_h - 67 + 5 * 6 + 2;
  487.     pcv->rcl.d.bottom = pcv->win_v - 16 + 12 + 2;
  488.     pcv->lxy.p.x = pcv->win_h - 67;
  489.     pcv->lxy.p.y = pcv->win_v - 16;
  490.  
  491.     GMAndRectRgn(pcv->txtRgnHdl, pcv->windowPtr->graph.clipping, &txtrc);
  492.     GMCopyRgn(pcv->winRgnHdl, pcv->windowPtr->graph.clipping);
  493.  
  494.     CMMove(pcv->btn1Hdl ,LONGWORD(   0,pcv->win_v - 19));
  495.     CMMove(pcv->btn2Hdl ,LONGWORD(  30,pcv->win_v - 19));
  496.     CMMove(pcv->btn3Hdl ,LONGWORD(  60,pcv->win_v - 19));
  497.     CMMove(pcv->btn4Hdl ,LONGWORD(  90,pcv->win_v - 19));
  498.     CMMove(pcv->btn5Hdl ,LONGWORD( 120,pcv->win_v - 19));
  499.     CMMove(pcv->btn6Hdl ,LONGWORD( 150,pcv->win_v - 19));
  500.     CMMove(pcv->btn7Hdl ,LONGWORD( 180,pcv->win_v - 19));
  501.     CMMove(pcv->btn8Hdl ,LONGWORD( 210,pcv->win_v - 19));
  502.     CMMove(pcv->btn9Hdl ,LONGWORD( 240,pcv->win_v - 19));
  503.     CMMove(pcv->btn92Hdl,LONGWORD( 270,pcv->win_v - 19));
  504.     CMMove(pcv->btn93Hdl,LONGWORD( 300,pcv->win_v - 19));
  505.     CMMove(pcv->btn10Hdl,LONGWORD( 330,pcv->win_v - 19));
  506.     CMMove(pcv->btn11Hdl,LONGWORD( 360,pcv->win_v - 19));
  507.  
  508.     CMMove(pcv->btn12Hdl,LONGWORD( pcv->win_h - 29,pcv->win_v - 19));
  509.     CMMove(pcv->volHdl  ,LONGWORD( pcv->win_h - 178,pcv->win_v - 19));
  510.  
  511. }
  512.  
  513. /******************************************************************************
  514.  *    msLDownEvent():    マウスレフトダウンイベント処理
  515.  ******************************************************************************
  516.  *    引数:    ComVal *pcv    共通変数へのポインタ
  517.  *    注釈:
  518.  *    ウィンドウ上でマウスの左ボタンが押された場合の処理を行う。
  519.  *    この処理でクローズボタンによる終了、ウィンドウの移動が可能となります。
  520.  */
  521. void msLDownEvent(ComVal *pcv)
  522. {
  523.     int partCode;            /* ウィンドウのパートコード    */
  524.     Window *wTemp;            /* テンポラリウィンドウポインタ    */
  525.     Rect comRc = { 0, 0, 18, WIN_V - 20 };     /* コマンド領域     */
  526.     Rect btnRc = { 0, 361, WIN_H, WIN_V };     /* ボタン領域         */
  527.  
  528.     comRc.d.right  = pcv->fontS[pcv->font];
  529.     comRc.d.bottom = pcv->win_v - 19;
  530.  
  531.     btnRc.d.top    = pcv->win_v - 19;
  532.     btnRc.d.right  = pcv->win_h;
  533.     btnRc.d.bottom = pcv->win_v;
  534.  
  535.     /* イベントが自分のウィンドウか? */
  536.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  537.         /* ウィンドウがインアクティブで、OPT.1キーが押されてないか? */
  538.         if (!pcv->activeFlag && !(pcv->event.ev.how & KS_OPT1)) {
  539.             /* ウィンドウをアクティブにする */
  540.             WMSelect(pcv->windowPtr);
  541.             /* ボタンが押された場所のパートコードを取得する */
  542.             partCode = WMFind(pcv->event.ev.where.x_y, &wTemp);
  543.             /* タイトルバー以外か、左ボタンが離されたか? */
  544.             if (partCode != W_INDRAG || !EMLStill()) {
  545.                 return;
  546.             }
  547.         }
  548.         /* マウスのボタンが押されている間、ウィンドウの各種処理をシス
  549.            テムに任せて、ボタンが離された場所のパートコードを取得する */
  550.         partCode = SXCallWindM(pcv->windowPtr, &pcv->event);
  551.         if (partCode == W_INCLOSE) {    /* クローズボタンか?        */
  552.             pcv->endFlag = TRUE;    /* 終了フラグをセットする    */
  553.             pcv->saveFlag = 0;
  554.         }
  555.         if (partCode == W_ININSIDE) {    /* ウィンドウの内側        */
  556.             if (GMPtInRect(&pcv->view, EMMSLoc())) {
  557.                 if (EMRWait()) { /* 左右ボタンともに押されている*/
  558.                     retpastf(pcv);
  559.                     TSGetEvent(pcv->eventMask, &pcv->event);
  560.                     return;
  561.                 }
  562.                 pcv->scrollFlag = scrollTxt(pcv, 1);
  563.             }
  564.             if (GMPtInRect(&comRc, EMMSLoc())) { /* 'TYPE='解読    */
  565.                 nextfile(pcv);
  566.             }
  567.             if (GMPtInRect(&btnRc, EMMSLoc())) { /* control check    */
  568.                 checkControl(pcv);
  569.             }
  570.         }
  571.  
  572.     }
  573. }
  574.  
  575. /******************************************************************************
  576.  *    checkControl():    コントロールのチェック
  577.  ******************************************************************************
  578.  *    引数:    ComVal *pcv    共通変数へのポインタ
  579.  */
  580. void checkControl(ComVal *pcv)
  581. {
  582.     int partCode;            /* コントロールのパートコード    */
  583.     int val;            /* コントロールの値        */
  584.     Control **ctrlHdl;        /* コントロールハンドル        */
  585.     char str[16], execfname[90], command[90];
  586.     int sclbuff;
  587.     char *txtPt;
  588.     int *txtNo;
  589.     int i,rtn;
  590.  
  591.     /* マウスのボタンが押されている間、コントロールの各種処理をシステムに
  592.        任せて、コントロールハンドルとボタンが離された場所のパートコードを
  593.        取得する */
  594.     partCode = SXCallCtrlM(pcv->windowPtr, &pcv->event, 0, 0, 0, &ctrlHdl);
  595.  
  596.     if (pcv->loadFlag == 0)            /* テキストが未表示なら戻る    */
  597.         return;
  598.  
  599.     switch (partCode) {
  600.     case C_INBTTN:                /* 文字ボタン    */
  601.         /* ボタン1か(行頭処理)? */
  602.         if (ctrlHdl == pcv->btn1Hdl && pcv->ofset != 0) {
  603.             pcv->ofset = 0;
  604.             drawGraph(pcv ,0);    /* テキスト全体を書き替え */
  605.             break;
  606.         }
  607.         /* ボタン2か(行末処理)? */
  608.         if (ctrlHdl == pcv->btn2Hdl) {
  609.             pcv->ofset = pcv->Maxline - 29;
  610.             drawGraph(pcv ,0);    /* テキスト全体を書き替え */
  611.             break;
  612.         }
  613.         /* ボタン3か(前項処理)? */
  614.         if (ctrlHdl == pcv->btn3Hdl && pcv->ofset > 0) {
  615.             pcv->ofset = pcv->ofset - 29;
  616.             if (pcv->ofset < 0)
  617.                 pcv->ofset =0;
  618.             drawGraph(pcv ,0);    /* テキスト全体を書き替え */
  619.             break;
  620.         }
  621.         /* ボタン4か(次項処理)? */
  622.         if (ctrlHdl == pcv->btn4Hdl && pcv->ofset < pcv->Maxline - 29) {
  623.             pcv->ofset = pcv->ofset + 29;
  624.             if (pcv->ofset + 29 > pcv->Maxline)
  625.                 pcv->ofset = pcv->Maxline - 29;
  626.             drawGraph(pcv ,0);    /* テキスト全体を書き替え */
  627.             break;
  628.         }
  629.         /* ボタン5か(改区前処理)? */
  630.         if (ctrlHdl == pcv->btn5Hdl) {
  631.             MMHdlLock(pcv->txt);
  632.             MMHdlLock(pcv->txtNo);
  633.             txtPt = *(pcv->txt);
  634.             txtNo = *(pcv->txtNo);
  635.             for (i=pcv->ofset - 1;i>0;i--) {
  636.                 if (!strncmp("━", (txtPt + *(txtNo + i)), 2))
  637.                     break;
  638.             }
  639.             MMHdlUnlock(pcv->txtNo);
  640.             MMHdlUnlock(pcv->txt);
  641.             if (i<0)
  642.                 break;
  643.             pcv->ofset = i;
  644.             drawGraph(pcv ,0);    /* テキスト全体を書き替え */
  645.             break;
  646.         }
  647.         /* ボタン6か(改区後処理)? */
  648.         if (ctrlHdl == pcv->btn6Hdl) {
  649.             MMHdlLock(pcv->txt);
  650.             MMHdlLock(pcv->txtNo);
  651.             txtPt = *(pcv->txt);
  652.             txtNo = *(pcv->txtNo);
  653.             for (i=pcv->ofset + 1;i<pcv->Maxline;i++) {
  654.                 if (!strncmp("━", (txtPt + *(txtNo + i)), 2))
  655.                     break;
  656.             }
  657.             MMHdlUnlock(pcv->txtNo);
  658.             MMHdlUnlock(pcv->txt);
  659.             if (i>pcv->Maxline)
  660.                 break;
  661.             if (i>pcv->Maxline - 29)
  662.                 i = pcv->Maxline - 29;
  663.             pcv->ofset = i;
  664.             drawGraph(pcv ,0);    /* テキスト全体を書き替え */
  665.             break;
  666.         }
  667.         /* ボタン7か(前行処理)? */
  668.         if (ctrlHdl == pcv->btn7Hdl && pcv->ofset > 0) {
  669.             sclbuff = pcv->scrollstep;
  670.             pcv->scrollstep = 1;
  671.             scrollTxt(pcv, -1);
  672.             pcv->scrollstep = sclbuff;
  673.             break;
  674.         }
  675.         /* ボタン8か(次行処理)? */
  676.         if (ctrlHdl == pcv->btn8Hdl && pcv->ofset < pcv->Maxline - 29) {
  677.             sclbuff = pcv->scrollstep;
  678.             pcv->scrollstep = 1;
  679.             scrollTxt(pcv, 1);
  680.             pcv->scrollstep = sclbuff;
  681.             break;
  682.         }
  683.         /* ボタン9か(検索処理)? */
  684.         if (ctrlHdl == pcv->btn9Hdl) {
  685.             if ((rtn = dialogProc5(pcv, 0)) >= 0) {
  686.                 pcv->ofset = pcv->ofset - 15;
  687.  
  688.                 if (pcv->status + 29 > pcv->Maxline)
  689.                     pcv->ofset = pcv->Maxline - 29;
  690.                 else if (pcv->status < 15)
  691.                     pcv->ofset = 0;
  692.  
  693.                 rtn = (rtn - pcv->ofset + 1) * pcv->fontS[pcv->font];
  694.                 drawGraph(pcv ,0);
  695.                 i = GMForeColor(G_RED);
  696.                 GMMove(LONGWORD(0, rtn));
  697.                 GMLine(LONGWORD(pcv->fontS[pcv->font] * 97, rtn));
  698.                 GMForeColor(i);
  699.  
  700.                 CMShine(pcv->btn92Hdl,C_ACTIVE);
  701.                 CMShine(pcv->btn93Hdl,C_ACTIVE);
  702.  
  703.         }
  704.             break;
  705.         }
  706.         /* ボタン92か(全域検索処理)? */
  707.         if (ctrlHdl == pcv->btn92Hdl) {
  708.             if ((rtn = dialogProc5(pcv, 1)) >= 0) {
  709.                 pcv->ofset = pcv->ofset - 15;
  710.  
  711.                 if (pcv->status + 29 > pcv->Maxline)
  712.                     pcv->ofset = pcv->Maxline - 29;
  713.                 else if (pcv->status < 15)
  714.                     pcv->ofset = 0;
  715.  
  716.                 rtn = (rtn - pcv->ofset + 1) * pcv->fontS[pcv->font];
  717.                 drawGraph(pcv ,0);
  718.                 i = GMForeColor(G_RED);
  719.                 GMMove(LONGWORD(0, rtn));
  720.                 GMLine(LONGWORD(pcv->fontS[pcv->font] * 97, rtn));
  721.                 GMForeColor(i);
  722.         }
  723.             break;
  724.         }
  725.         /* ボタン93か(次検索処理)? */
  726.         if (ctrlHdl == pcv->btn93Hdl) {
  727.             if ((rtn = dialogProc5(pcv, 2)) >= 0) {
  728.                 pcv->ofset = pcv->ofset - 15;
  729.  
  730.                 if (pcv->status + 29 > pcv->Maxline)
  731.                     pcv->ofset = pcv->Maxline - 29;
  732.                 else if (pcv->status < 15)
  733.                     pcv->ofset = 0;
  734.  
  735.                 rtn = (rtn - pcv->ofset + 1) * pcv->fontS[pcv->font];
  736.                 drawGraph(pcv ,0);
  737.                 i = GMForeColor(G_RED);
  738.                 GMMove(LONGWORD(0, rtn));
  739.                 GMLine(LONGWORD(pcv->fontS[pcv->font] * 97, rtn));
  740.                 GMForeColor(i);
  741.         }
  742.             break;
  743.         }
  744.         /* ボタン10か(演奏再開処理)? */
  745.         if (ctrlHdl == pcv->btn10Hdl && pcv->mloadFlag) {
  746.             if (pcv->mzTask != 0) {
  747.                 sprintf(command, " %s", pcv->mzOpt);
  748.                 pcv->mzTask = TSFockB(0, 0, pcv->mzFname, command, 0, execfname);
  749.                 sprintf(command, " %s", pcv->zmsfname);
  750.                 pcv->mzTask = TSFockB(0, 0, pcv->mzFname, command, 0, execfname);
  751.             } else {
  752.                 exec_zms("(P)");
  753.             }
  754.             break;
  755.         }
  756.         /* ボタン11か(演奏停止処理)? */
  757.         if (ctrlHdl == pcv->btn11Hdl && pcv->mloadFlag) {
  758.             exec_zms("(S)");
  759.             break;
  760.         }
  761.  
  762.         /* ボタン12か(復帰処理)? */
  763.         if (ctrlHdl == pcv->btn12Hdl) {
  764.             retpastf(pcv);
  765.             break;
  766.         }
  767.     case C_INTHUMB:            /* スライドボリューム        */
  768.         if (ctrlHdl == pcv->volHdl) {
  769.                 pcv->ofset = CMValueGet(pcv->volHdl);
  770.                 drawGraph(pcv ,0);    /* テキスト全体を書き替え */
  771.         }
  772.         break;
  773.     }
  774. }
  775.  
  776. /******************************************************************************
  777.  *    msRDownEvent():    マウスライトダウンイベント処理
  778.  ******************************************************************************
  779.  *    引数:    ComVal *pcv    共通変数へのポインタ
  780.  *    注釈:
  781.  *    ウィンドウ上でマウスの左ボタンが押された場合の処理を行う。
  782.  *    この処理でクローズボタンによる終了、ウィンドウの移動が可能となります。
  783.  */
  784. void msRDownEvent(ComVal *pcv)
  785. {
  786.     int partCode,mpos;        /* ウィンドウのパートコード    */
  787.     Window *wTemp;            /* テンポラリウィンドウポインタ    */
  788.  
  789.     /* イベントが自分のウィンドウか? */
  790.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  791.         /* ウィンドウがインアクティブで、OPT.1キーが押されてないか? */
  792.         if (!pcv->activeFlag && !(pcv->event.ev.how & KS_OPT1)) {
  793.             return;
  794.         }
  795.         /* マウスのボタンが押されている間、ウィンドウの各種処理をシス
  796.            テムに任せて、ボタンが離された場所のパートコードを取得する */
  797.         partCode = SXCallWindM(pcv->windowPtr, &pcv->event);
  798.         if (partCode == W_INDRAG) {    /* ドラッグリージョン        */
  799.             selectMenu(pcv);    /* メニューの作成と選択処理を行う */
  800.             return;
  801.         }
  802.         if (partCode == W_ININSIDE) {    /* ウィンドウの内側        */
  803.             if (EMLWait()) {    /* 左右ボタンともに押されている    */
  804.                 retpastf(pcv);
  805.                 TSGetEvent(pcv->eventMask, &pcv->event);
  806.                 return;
  807.             }
  808.             if (GMPtInRect(&pcv->view, EMMSLoc()))    /* 逆scroll    */
  809.                 pcv->scrollFlag = scrollTxt(pcv, -1);
  810.         }
  811.     }
  812. }
  813.  
  814. /******************************************************************************
  815.  *    selectMenu():    ポップアップメニューの作成と選択処理
  816.  ******************************************************************************
  817.  *    引数:    ComVal *pcv    共通変数へのポインタ
  818.  */
  819. void selectMenu(ComVal *pcv)
  820. {
  821.     int num;
  822.     char buff[90], dirname[90];
  823.  
  824.     if (pcv->loadFlag) 
  825.         num = MNSelect(            /* メニューの表示と選択を行う    */
  826.             pcv->menuHdl,        /* メニューハン    ドル        */
  827.             pcv->event.ev.where.x_y); /* マウスの右ボタンが押された位置 */
  828.     else
  829.         num = MNSelect(            /* メニューの表示と選択を行う    */
  830.             pcv->menuHdl2,        /* メニューハン    ドル        */
  831.             pcv->event.ev.where.x_y); /* マウスの右ボタンが押された位置 */
  832.  
  833.     switch (num) {
  834.     case 1:                    /* about me...            */
  835.         dialogProc1(pcv);
  836.         break;
  837.     case 2:
  838.         break;
  839.     case 3:                    /* ドライブパス設定        */
  840.         dialogProc2(pcv);
  841.         break;
  842.     case 4:                    /* 表示諸設定            */
  843.         dialogProc3(pcv);
  844.         break;
  845.     case 5:                    /* 起動プログラム設定        */
  846.         dialogProc4(pcv);
  847.         break;
  848.     case 6:
  849.         break;
  850.     case 7:                    /* ディレクトリオープン        */
  851.         dirname[0] = sprintf(&dirname[1], "%s %s", pcv->currentFname, "-H");
  852.         if (TSFockB(0, 0, "di.r", dirname, 0, buff) < 0)
  853.             DMError(D_CONFIRM, "ディレクトリウィンドウの\r
  854.                         オープンに失敗しました!");
  855.         break;
  856.     case 8:
  857.         break;
  858.     case 9:                    /* 終了フラグをセットする    */
  859.         pcv->endFlag = TRUE;
  860.         pcv->saveFlag = 0;
  861.         break;
  862.     }
  863. }
  864.  
  865. /******************************************************************************
  866.  *    dialogProc1():    ダイアログの作成、表示 (about me)
  867.  ******************************************************************************
  868.  *    引数:    ComVal *pcv    共通変数へのポインタ
  869.  */
  870. void dialogProc1(ComVal *pcv)
  871. {
  872.     Dialog *dialogPtr;
  873.     Graph *lastGraph;
  874.  
  875.     dialogPtr = TSReferDM(128,NULL,W_FRONT);
  876.  
  877.     lastGraph = GMGetGraph();    /* カレントグラフを退避する    */
  878.     /* ダイアログをカレントグラフにする */
  879.     GMSetGraph(&dialogPtr->window.graph);
  880.     GMAPage(G_ALLPAGE);
  881.     GMFontKind(G_ROM12);
  882.     GMFontFace(G_BOLD);
  883.     GMShadowStrZ("       Version", LONGWORD( 21,63));
  884.     GMShadowStrZ(   *pcv->versHdl, LONGWORD(123,63));
  885.     GMShadowStrZ("電脳倶楽部書類を表示します。", LONGWORD(30,80));
  886.     GMShadowStrZ("F.Ogasawara 1997",LONGWORD(60,100));
  887.     DMControl(NULL);
  888.     DMDispose(dialogPtr);        /* ダイアログを廃棄する    */
  889.     GMSetGraph(lastGraph);        /* カレントグラフを元に戻す    */
  890. }
  891.  
  892. /******************************************************************************
  893.  *    IdleEvent():    アイドルイベント処理
  894.  ******************************************************************************
  895.  *    引数:    ComVal *pcv    共通変数へのポインタ
  896.  */
  897. void IdleEvent(ComVal *pcv)
  898. {
  899.     if (pcv->scrollFlag) {
  900.         if (EMLBttn() || EMRBttn()) {    /* マウスのボタンが押されているか? */
  901.             /* イベントが自分のウィンドウか? */
  902.             if (pcv->event.ev.whom.win == pcv->windowPtr)
  903.                 scrollTxt(pcv, pcv->scrollDir);
  904.         } else {
  905.                 pcv->scrollFlag = FALSE; /* スクロールは終了した */
  906.         }
  907.     }
  908.     setlnum(pcv);
  909. }
  910.  
  911. /******************************************************************************
  912.  *    keyDownEvent():    キーダウンイベント処理
  913.  ******************************************************************************
  914.  *    引数:    ComVal *pcv    共通変数へのポインタ
  915.  *    注釈:    OPT.1+'Q'キーでの終了処理を行う。
  916.  */
  917. void keyDownEvent(ComVal *pcv)
  918. {
  919.     int shortCut;            /* ショートカットキー        */
  920.  
  921.     if (pcv->event.ev.how & KS_OPT1) { /* OPT.1キーが押されたか?    */
  922.         /* キー入力した文字を大文字に変換する */
  923.         shortCut = toupper((int) pcv->event.ev.whom.key.ascii);
  924.         if (shortCut == 'Q')    /* 終了か?            */
  925.             pcv->endFlag = TRUE; /* 終了フラグをセットする    */
  926.     }
  927. }
  928.  
  929. /******************************************************************************
  930.  *    updateEvent():    アップデート処理
  931.  ******************************************************************************
  932.  *    引数:    ComVal *pcv    共通変数へのポインタ
  933.  *    注釈:
  934.  *    アップデート処理としてウィンドウ内部を描画する。
  935.  *    この処理を行わないと、自分より下のウィンドウのアップデートやアイドル
  936.  *    イベントの処理ができなくなります。
  937.  */
  938. void updateEvent(ComVal *pcv)
  939. {
  940.     /* イベントが自分のウィンドウか? */
  941.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  942.         WMUpdate(pcv->windowPtr);    /* アップデートを開始する */
  943.         drawGraph(pcv ,0);        /* テキスト全体を書き替え */
  944.         WMUpdtOver(pcv->windowPtr);     /* アップデートを終了する */
  945.     }
  946. }
  947.  
  948. /******************************************************************************
  949.  *    drawGraph():    ウィンドウ内部の描画
  950.  ******************************************************************************
  951.  *    引数:    ComVal *pcv    共通変数へのポインタ
  952.  */
  953. void drawGraph(ComVal *pcv, int sel)
  954. {
  955.  
  956.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  957.     drawtxt(pcv, sel);
  958.     GMFontKind(G_ROM12);
  959.     GMFontSize(LONGWORD(12,12));
  960.     CMValueSet(pcv->volHdl, pcv->ofset);
  961.     if (pcv->mloadFlag == 0) {    /* ZMSファイルロード済み?    */
  962.         CMShine(pcv->btn10Hdl, C_INACTIVE);
  963.         CMShine(pcv->btn11Hdl, C_INACTIVE);
  964.     }
  965.     if (pcv->mojiFlag == 0) {    /* 検索文字指定済み?        */
  966.         CMShine(pcv->btn92Hdl, C_INACTIVE);
  967.         CMShine(pcv->btn93Hdl, C_INACTIVE);
  968.     }
  969.     if (pcv->pastFno == 0)        /* 下層テキストロード済み?    */
  970.         CMShine(pcv->btn12Hdl, C_INACTIVE);
  971.     CMDraw(pcv->windowPtr);
  972.     if (pcv->loadFlag && pcv->lineDisp) { /* 行番号表示        */
  973.         GMShadowRect(&pcv->rcl);
  974.         setlnum(pcv);
  975.     }
  976. }
  977.  
  978. /******************************************************************************
  979.  *    setlnum():    行番号表示
  980.  ******************************************************************************
  981.  *    引数:    ComVal *pcv    共通変数へのポインタ
  982.  */
  983. void setlnum(ComVal *pcv)
  984. {
  985.     Point mpos;
  986.     int comline;
  987.     char buff[10];
  988.  
  989.     if (!pcv->lineDisp || pcv->loadFlag == 0)
  990.         return;
  991.  
  992.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  993.     mpos.x_y = EMMSLoc();
  994.     if (!pcv->activeFlag || mpos.p.x < 0 || mpos.p.x > pcv->win_h ||
  995.         mpos.p.y < -20 || mpos.p.y > pcv->win_v)
  996.         return;
  997.  
  998.     comline = pcv->ofset + (mpos.p.y / pcv->fontS[pcv->font]) + 1;
  999.  
  1000.     if (mpos.p.y < 0) {
  1001.         strcpy(buff, "~BAR~");
  1002.     } else if (mpos.p.y > pcv->win_v - 20) {
  1003.         strcpy(buff, "_BAR_");
  1004.     } else {
  1005.         sprintf(buff, "%5d", comline);
  1006.     }
  1007.     GMFontKind(G_ROM12);
  1008.     GMFontSize(LONGWORD(12,12));
  1009.     GMMove(pcv->lxy.x_y);
  1010.     GMDrawStrZ(buff);
  1011. }
  1012.  
  1013. /******************************************************************************
  1014.  *    activateEvent():    アクティベートイベント処理
  1015.  ******************************************************************************
  1016.  *    引数:    ComVal *pcv    共通変数へのポインタ
  1017.  *    注釈:    アクティブ、インアクティブによるアクティブフラグの切り替えと、
  1018.  *        イベントマスクの切り替えを行う。
  1019.  */
  1020. void activateEvent(ComVal *pcv)
  1021. {
  1022.     /* イベントが自分のウィンドウか? */
  1023.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  1024.         pcv->activeFlag = TRUE;    /* アクティブフラグをセットする    */
  1025.         /* アクティブ時のイベントマスクをセットする */
  1026.         pcv->eventMask = EVENTMASK | EM_KEYDOWN;
  1027.     /* イベントが他のウィンドウで、自分がアクティブ状態か? */
  1028.     } else if (pcv->activeFlag) {
  1029.         pcv->activeFlag = FALSE; /* アクティブフラグをクリアする */
  1030.         /* インアクティブ時のイベントマスクをセットする */
  1031.         pcv->eventMask = EVENTMASK;
  1032.     }
  1033. }
  1034.  
  1035. /******************************************************************************
  1036.  *    systemEvent():    システムイベント処理
  1037.  ******************************************************************************
  1038.  *    引数:    ComVal *pcv    共通変数へのポインタ
  1039.  *    注釈:    全ウィンドウのクローズ、全タスクの終了、ウィンドウのセレクトに
  1040.  *        対応した処理を行う。
  1041.  */
  1042. void systemEvent(ComVal *pcv)
  1043. {
  1044.     switch (pcv->event.ts.what2) {    /* イベントの種類は?        */
  1045.     case CLOSEALL:            /* 全ウィンドウのクローズ    */
  1046.     case ENDTSK:            /* 全タスクの終了        */
  1047.         pcv->endFlag  = TRUE;    /* 終了フラグをセットする    */
  1048.         pcv->saveFlag = 1;
  1049.         break;
  1050.     case WINDOWSELECT:        /* ウィンドウのセレクト        */
  1051.         WMSelect(pcv->windowPtr); /* ウィンドウをアクティブにする */
  1052.         break;
  1053.     case DRAGEND:            /* ドラッグの終了        */
  1054.         /* イベントが自分のウィンドウか? */
  1055.         if (pcv->event.ev.whom.win == pcv->windowPtr) {
  1056.             /* ラバーバンドを消去する */
  1057.             TSHideDrag();
  1058.             /* アイコンのドロップ処理を行う */
  1059.             dropIcon(pcv);
  1060.         }
  1061.         break;
  1062.     }
  1063. }
  1064.  
  1065. /******************************************************************************
  1066.  *    showErrDialog():    エラーダイアログの表示
  1067.  ******************************************************************************
  1068.  *    引数:    ComVal *pcv    共通変数へのポインタ
  1069.  */
  1070. void showErrDialog(ComVal *pcv)
  1071. {
  1072.     int i;
  1073.  
  1074.     static struct {            /* エラー情報        */
  1075.         int code;        /* エラーコード        */
  1076.         int manager;        /* 使用するマネージャ    */
  1077.         int flag;        /* 表示フラッグ        */
  1078.         char *message;        /* エラーメッセージ    */
  1079.     } errInfo[] = {
  1080.         { 1, 1, D_RED,    "SX SYSTEMのバージョンが違います。" },
  1081.         { 2, 2, D_RED,    "ウィンドウが作成できません。" },
  1082.         { 0, 1, D_YELLOW, "エラーが発生しました。" }
  1083.     };
  1084.  
  1085.     for (i = 0; errInfo[i].code != 0; i++) /* エラーコードを捜す    */
  1086.         if (errInfo[i].code == pcv->errorCode)
  1087.             break;
  1088.     switch (errInfo[i].manager) {    /* マネージャの選択        */
  1089.     case 1:                /* ダイアログマン        */
  1090.         DMError(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
  1091.         break;
  1092.     case 2:                /* タスクマン            */
  1093.         TSErrDialogN(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
  1094.         break;
  1095.     }
  1096. }
  1097.  
  1098. /******************************************************************************
  1099.  *    endProc():    終了手続き
  1100.  ******************************************************************************
  1101.  *    引数:    int code    終了コード
  1102.  *        ComVal *pcv    共通変数へのポインタ
  1103.  *    注釈:    ハンドルの解放やウィンドウの廃棄と、プログラムの終了を行う。
  1104.  */
  1105. void endProc(int code, ComVal *pcv)
  1106. {
  1107.     int i,j;
  1108.  
  1109.     if (pcv->resOk) {
  1110.         /* 環境設定の保存    */
  1111.         **pcv->mzHdl  =  pcv->mzTask;
  1112.         **pcv->pcmHdl =  pcv->pcmTask;
  1113.         **pcv->picHdl =  pcv->picTask;
  1114.  
  1115.         **pcv->envHdl         =  pcv->scrollstep;
  1116.         *((*pcv->envHdl) + 1)     =  pcv->cutDisp;
  1117.         *((*pcv->envHdl) + 2)    =  pcv->lineDisp;
  1118.         *((*pcv->envHdl) + 3)    =  pcv->picOff;
  1119.         *((*pcv->envHdl) + 4)    =  pcv->font;
  1120.         *((*pcv->envHdl) + 5)    =  pcv->saveFlag;
  1121.  
  1122.         strcpy((*pcv->mzHdl)  +  1,     pcv->mzFname);
  1123.         strcpy((*pcv->mzHdl)  + 91,     pcv->mzOpt);
  1124.         strcpy((*pcv->pcmHdl) +  1,     pcv->pcmFname);
  1125.         strcpy((*pcv->pcmHdl) + 91,     pcv->pcmOpt);
  1126.         strcpy((*pcv->picHdl) +  1,     pcv->picFname);
  1127.         strcpy((*pcv->picHdl) + 91,     pcv->picOpt);
  1128.  
  1129.         *((*pcv->envHdl) + 6) = 0;
  1130.         for(i=0;i<11;i++) {
  1131.             *((*pcv->envHdl) + 7 + i) = 0;
  1132.             for(j=0;j<90;j++) {
  1133.                 *((*pcv->stsHdl) + i * 90 + j) = 0;
  1134.                 *((*pcv->cpthHdl) + i * 90 + j) = 0;
  1135.             }
  1136.         }
  1137.         for(i=0;i<180;i++)
  1138.             *((*pcv->dpthHdl) + i) = 0;
  1139.  
  1140.         if (pcv->saveFlag) {
  1141.             *((*pcv->envHdl) + 18) = pcv->ofset;
  1142.             *((*pcv->envHdl) + 6) = pcv->pastFno;
  1143.             strcpy(*pcv->dpthHdl, pcv->a_drv);
  1144.             strcpy(*pcv->dpthHdl + 90, pcv->b_drv);
  1145.             strcpy(*pcv->dpthHdl + 180, pcv->c_drv);
  1146.             strcpy(*pcv->dpthHdl + 270, pcv->title);
  1147.             if (pcv->pastFno > 0) {
  1148.                 strcpy(*pcv->stsHdl, pcv->currentFname);
  1149.                 strcpy(*pcv->cpthHdl, pcv->currentPath);
  1150.                 for(i=0;i<pcv->pastFno;i++) {
  1151.                     *((*pcv->envHdl) + 7 + i) = pcv->pastofset[i];
  1152.                     strcpy((*pcv->stsHdl) + (i + 1) * 90, &pcv->pastFname[i][0]);
  1153.                     strcpy((*pcv->cpthHdl) + (i + 1) * 90, &pcv->pastPath[i][0]);
  1154.                 }
  1155.             }
  1156.         }
  1157.  
  1158.         *((*pcv->env2Hdl)    ) = pcv->set_as_a;
  1159.         *((*pcv->env2Hdl) + 1) = pcv->fore_color;
  1160.         *((*pcv->env2Hdl) + 2) = pcv->back_color;
  1161.         *((*pcv->env2Hdl) + 3) = pcv->fcache_c;
  1162.  
  1163.         TSResSave(pcv->lbFname);
  1164.     }
  1165.  
  1166.     if (pcv->menuHdl != NULL)
  1167.         MMHdlDispose(pcv->menuHdl);  /* メニューハンドルを解放する */
  1168.     if (pcv->menuHdl2 != NULL)
  1169.         MMHdlDispose(pcv->menuHdl2); /* メニューハンドルを解放する */
  1170.  
  1171.     if (pcv->hResMap != NULL)
  1172.         TSResRemove();        /* リソースマップハンドル */
  1173.  
  1174.     if (pcv->txt != NULL)
  1175.         MMHdlDispose(pcv->txt);    /* テキスト領域のハンドル */
  1176.  
  1177.     if (pcv->txtNo != NULL)
  1178.         MMHdlDispose(pcv->txtNo); /* 改行情報のハンドル   */
  1179.  
  1180.     for(i=0;i<MAX_DEPTH;i++) { /* ファイルキャッシュのハンドル    */
  1181.         if (pcv->txt_cache[i] != NULL)
  1182.             MMHdlDispose(pcv->txt_cache);
  1183.         if (pcv->txtNo_cache[i] != NULL)
  1184.             MMHdlDispose(pcv->txtNo_cache);
  1185.     }
  1186.  
  1187.     for(i=pcv->depth;i>0;i--)    /* カットファイルキャッシュ解放    */
  1188.         dispoBits(pcv);
  1189.  
  1190.     if (pcv->updateRgnHdl != NULL)
  1191.         GMDisposeRgn(pcv->updateRgnHdl); /* アップデートリージョン
  1192.                             ハンドルの解放      */
  1193.  
  1194.     if (pcv->txtRgnHdl != NULL)
  1195.         GMDisposeRgn(pcv->txtRgnHdl); /* テキスト描画リージョン */
  1196.  
  1197.     if (pcv->winRgnHdl != NULL)
  1198.         GMDisposeRgn(pcv->winRgnHdl); /* ウィンドウリージョン    */
  1199.  
  1200.     dispoBits(pcv);
  1201.  
  1202.     /* ウィンドウポインタが確保されたままか? */
  1203.     if (pcv->windowPtr != NULL)
  1204.         CMKill(pcv->windowPtr);    /* すべてのコントロールを廃棄する */
  1205.         WMDispose(pcv->windowPtr); /* ウィンドウを廃棄する    */
  1206.  
  1207.     exit(code);            /* プログラムを終了する        */
  1208. }
  1209. STR@慢EdEV3.00<@(!%G0JHH     
  1210. ;7\7
  1211. 6W^コマ Z@ "    (.Ohh$000ヨ=STL@ケL